package com.copera.cn.kaka;

import java.io.IOException;
import java.util.Vector;

import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.Result;
import com.mining.app.zxing.camera.CameraManager;
import com.mining.app.zxing.decoding.CaptureActivityHandler;
import com.mining.app.zxing.decoding.FinishListener;
import com.mining.app.zxing.decoding.InactivityTimer;
import com.mining.app.zxing.view.ViewfinderView;

public class TrackRecordFragment extends Fragment  implements Callback{
	private ApplicationCustomer appc;
	private ViewfinderView viewfinderView;
	private boolean hasSurface;
	private InactivityTimer inactivityTimer;
	private SurfaceView surfaceView;
	private Vector<BarcodeFormat> decodeFormats;
	private String characterSet;
	private boolean playBeep;
	private boolean vibrate;
	private CaptureActivityHandler handler;
	private MediaPlayer mediaPlayer;
	private static final float BEEP_VOLUME = 0.10f;
	private TextView tv_time;
	private RelativeLayout  rl_query;
	private Button set ;
	private String type;
	

	public TextView getTv_time() {
		return tv_time;
	}
	public void setTv_time(TextView tv_time) {
		this.tv_time = tv_time;
	}
	public RelativeLayout getRl_query() {
		return rl_query;
	}
	public void setRl_query(RelativeLayout rl_query) {
		this.rl_query = rl_query;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public static TrackRecordFragment newInstance(int index) {
		TrackRecordFragment f = new TrackRecordFragment();

		Bundle args = new Bundle();
		args.putInt("index", index);
		f.setArguments(args);

		return f;
	}
    public void showTrackRecord(){
    	int i=0;
    	System.out.print(i);
    }
	public int getShownIndex() {
		return getArguments().getInt("index", 0);
	}
   
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.barcode, container, false);
		CameraManager.init(getActivity().getApplication());
		viewfinderView = (ViewfinderView) view
				.findViewById(R.id.viewfinder_view);
		appc = (ApplicationCustomer) getActivity().getApplication();

		hasSurface = false;
		surfaceView = (SurfaceView) view.findViewById(R.id.preview_view);
		inactivityTimer = new InactivityTimer(getActivity());
		tv_time = (TextView)view.findViewById(R.id.tv_time);
		rl_query = (RelativeLayout)view.findViewById(R.id.query);
		tv_time.setVisibility(View.VISIBLE);
		handlerTime.post(updateThread);
		set = (Button)view.findViewById(R.id.bt_set);
		initEvent();
		return view;
	}
	
	public void initEvent(){
		set.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(getActivity(),
						ShopSetHomeActivity.class);
				
				startActivity(intent);
				

			}
		});
		
	}
	//��ʱ��
	Handler handlerTime = new Handler();
	Runnable updateThread = new Runnable() {
		@Override
		public void run() {
			String str = tv_time.getText().toString();
			int num = Integer.parseInt(str.substring(2, 4));
			if(num > 0){
				num = num - 1;
				if (num > 9) {
					tv_time.setText("0:"+num);
				}else {
					tv_time.setText("0:0"+num);
				}
			}else{
				tv_time.setText("0:59");
			}
			handlerTime.postDelayed(updateThread, 1000);  

		}
	};
	@Override
	public void onResume() {
		super.onResume();

		SurfaceHolder surfaceHolder = surfaceView.getHolder();
		if (hasSurface) {
			initCamera(surfaceHolder);
		} else {
			surfaceHolder.addCallback(this);
			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		}
		decodeFormats = null;
		characterSet = null;

		playBeep = true;
		AudioManager audioService = (AudioManager) getActivity()
				.getSystemService(Context.AUDIO_SERVICE);
		if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
			playBeep = false;
		}
		initBeepSound();
		vibrate = true;

	}

	@Override
	public void onPause() {
		super.onPause();
		if (handler != null) {
			handler.quitSynchronously();
			handler = null;
		}
		CameraManager.get().closeDriver();
	}

	@Override
	public void onDestroy() {
		inactivityTimer.shutdown();
		super.onDestroy();
	}
	/**
	 * ����ɨ����
	 * 
	 * @param result
	 * @param barcode
	 */
	public void handleDecode(Result result, Bitmap barcode) {
		inactivityTimer.onActivity();
		playBeepSoundAndVibrate();
		String barCode = result.getText();
		if (barcode != null && !"".equals(barcode)) {
			Intent intent = new Intent(getActivity(),TrackRecordActivity.class);
			startActivity(intent);
			getActivity().finish();
		}
		//loadData();

	}

	private void initCamera(SurfaceHolder surfaceHolder) {
		try {
			CameraManager.get().openDriver(surfaceHolder);
		} catch (IOException ioe) {
			return;
		} catch (RuntimeException e) {
			return;
		}
		if (handler == null) {
			handler = new CaptureActivityHandler(this, decodeFormats,
					characterSet);
		}
		
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		if (!hasSurface) {
			hasSurface = true;
			initCamera(holder);
		}

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		hasSurface = false;

	}

	public ViewfinderView getViewfinderView() {
		return viewfinderView;
	}

	public Handler getHandler() {
		return handler;
	}

	public void drawViewfinder() {
		viewfinderView.drawViewfinder();

	}

	private void initBeepSound() {
		if (playBeep && mediaPlayer == null) {
			// The volume on STREAM_SYSTEM is not adjustable, and users found it
			// too loud,
			// so we now play on the music stream.
			getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC);
			mediaPlayer = new MediaPlayer();
			mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			mediaPlayer.setOnCompletionListener(beepListener);

			AssetFileDescriptor file = getResources().openRawResourceFd(
					R.raw.beep);
			try {
				mediaPlayer.setDataSource(file.getFileDescriptor(),
						file.getStartOffset(), file.getLength());
				file.close();
				mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
				mediaPlayer.prepare();
			} catch (IOException e) {
				mediaPlayer = null;
			}
		}
	}

	private static final long VIBRATE_DURATION = 200L;

	private void playBeepSoundAndVibrate() {
		if (playBeep && mediaPlayer != null) {
			mediaPlayer.start();
		}
		if (vibrate) {
			Vibrator vibrator = (Vibrator) getActivity().getSystemService(
					Context.VIBRATOR_SERVICE);
			vibrator.vibrate(VIBRATE_DURATION);
		}
	}

	/**
	 * When the beep has finished playing, rewind to queue up another one.
	 */
	private final OnCompletionListener beepListener = new OnCompletionListener() {
		public void onCompletion(MediaPlayer mediaPlayer) {
			mediaPlayer.seekTo(0);
		}
	};
	

}
